#![allow(unused_imports)]
#![allow(dead_code)]
use rstest::*;
use serde::{Deserialize, Serialize};
use serde_json::{Value, json};

// 定义 JSON-RPC 请求结构体
#[derive(Debug, Serialize)]
struct JsonRpcRequest {
    jsonrpc: String,
    method: String,
    params: Value,
    id: Value,
}

// 定义 JSON-RPC 响应结构体
#[derive(Debug, Deserialize)]
struct JsonRpcResponse {
    jsonrpc: String,
    result: Option<Value>,
    error: Option<JsonRpcError>,
    id: Option<Value>,
}

// 定义 JSON-RPC 错误结构体
#[derive(Debug, Deserialize)]
struct JsonRpcError {
    code: i64,
    message: String,
    data: Option<Value>,
}

#[rstest]
#[case("add", json!([1, 2]), json!(3))]
#[case("subtract", json!([5, 3]), json!(2))]
#[case("multiply", json!([4, 5]), json!(20))]
#[tokio::test]
async fn test_jsonrpc_methods(
    #[case] method: &str,
    #[case] params: Value,
    #[case] expected: Value,
) -> Result<(), Box<dyn std::error::Error>> {
    // 服务器地址
    let server_url = "https://127.0.0.1:7878/call";

    // 构建 JSON-RPC 请求
    let request = JsonRpcRequest {
        jsonrpc: "2.0".to_string(),
        method: method.to_string(),
        params,
        id: json!(1),
    };

    // 创建 HTTP 客户端，禁用证书验证（仅用于开发环境）
    let client = reqwest::Client::builder()
        .danger_accept_invalid_certs(true)
        .build()?;

    // 发送 POST 请求
    println!("发送 JSON-RPC 请求到: {}", server_url);
    let res = client
        .post(server_url)
        .json(&request)
        .send()
        .await?
        .json::<JsonRpcResponse>()
        .await?;

    // 打印响应
    println!("收到 JSON-RPC 响应: {:?}", res);

    // 验证结果
    if let Some(result) = res.result {
        assert_eq!(result, expected, "方法 {} 返回了错误的结果", method);
        println!("测试成功: {} 方法返回了正确的结果 ({:?})", method, expected);
    } else if let Some(error) = res.error {
        panic!("测试失败: 收到错误响应: {:?}", error);
    } else {
        panic!("测试失败: 收到无效响应");
    }

    Ok(())
}

fn main() {}